home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
FM Towns: Free Software Collection 7
/
FM Towns Free Software Collection 7.iso
/
t_os
/
tif2xbm
/
src
/
tif2x010.c
< prev
Wrap
C/C++ Source or Header
|
1993-11-30
|
5KB
|
223 lines
/*************************************************************************
TIFF → XBM コンバータ TIF2XBM Ver 0.10
Jun. 30, 1993
Copyright (c) すりぃPi 1993
**************************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <msdos.cf> /* get_ds */
#include <egb.h>
#include <mos.h>
typedef struct point{
int x ;
int y ;
} POINT ;
typedef struct rect{
int x1 ;
int y1 ;
int x2 ;
int y2 ;
} RECT ;
void get_block( RECT rect, char *buf ) ;
void put_xbm( int width, int height, char *buf, char *filename ) ;
char bit_reverse( char buf ) ;
void GRA_init( void ) ;
void GRA_box_xor( RECT rect ) ;
POINT GRA_mos_left_drop( POINT point ) ;
void GRA_mos_left_up( void ) ;
RECT select( RECT rect ) ;
void swap( int *data1, int *data2 ) ;
char gwk[1536] ;
char mwk[4096] ;
char pat_work[258] ;
void main( int argc, char *argv[] )
{
int width ;
int height ;
char *filename ;
char *buf ;
int bufsize ;
RECT rect ;
if( argc < 2 )
exit(1) ;
filename = argv[1] ;
GRA_init() ;
/* この間に sidework の tiffloader で画像を読み込む(^^) */
/* 画像は 16色 にすること。2値画像では何故かうまくいかない?? */
/* と言ううちに、原因がわかった(^^;)。sidework の 「てふ」 は 2値 */
/* 画像を読み込む時に、色識別番号 0 で書き込まずに、8 で書き込ん*/
/* でいるのであった(^^)。くそ~、だいぶ悩んだぞぉ~(^^;)(^^;)。 */
rect = select( rect ) ;
MOS_end() ;
width = rect.x2 - rect.x1 + 1 ;
height = rect.y2 - rect.y1 + 1 ;
bufsize = ( width + 7 )/8 * height ;
if( (buf = (char *)malloc( bufsize )) == NULL ) exit( 1 ) ;
get_block( rect, buf ) ;
put_xbm( width, height, buf, filename ) ;
free( buf ) ;
}
void get_block( RECT rect, char *buf )
{
char para[32] ;
DWORD( para + 0 ) = (unsigned int)buf ;
WORD ( para + 4 ) = getds() ;
WORD ( para + 6 ) = rect.x1 ;
WORD ( para + 8 ) = rect.y1 ;
WORD ( para + 10 ) = rect.x2 ;
WORD ( para + 12 ) = rect.y2 ;
WORD ( para + 14 ) = 2 ;
DWORD( para + 16 ) = 0 ;
DWORD( para + 20 ) = 8 ;
EGB_getBlockColor( gwk, para ) ;
}
void put_xbm( int width, int height, char *buf, char *filename )
{
int i ;
int bufsize ;
bufsize = ( width + 7 )/8 * height ;
printf( "#define %s_width %d\n", filename, width ) ;
printf( "#define %s_height %d\n\n", filename, height ) ;
printf( "static char %s_bits[] = {\n", filename ) ;
printf( " 0x%02x", (int)bit_reverse( *buf++ ) ) ;
for( i = 2; i <= bufsize; i++ ){
if( (i % 12) == 1 )
printf( ",\n 0x%02x", (int)bit_reverse( *buf++ ) ) ;
else
printf( ", 0x%02x", (int)bit_reverse( *buf++ ) ) ;
}
printf( "\n}\n" ) ;
}
char bit_reverse( char buf )
{
int i ;
char bit = 0 ;
for( i = 1; ; i++ ){
bit = ( buf & 0x01 ) | bit ;
if( i == 8 ) break ;
buf >>= 1 ;
bit <<= 1 ;
}
return bit ;
}
void GRA_init( void )
{
EGB_init( gwk, 1536 ) ;
EGB_resolution( gwk, 0, 3 ) ;
EGB_displayPage( gwk, 0, 1 ) ;
EGB_writePage( gwk, 0 ) ;
EGB_color( gwk, 0, 0x00 ) ;
EGB_color( gwk, 1, 0x0F ) ;
EGB_clearScreen( gwk ) ;
MOS_start( mwk, 4096 ) ;
MOS_typeRom( 81, 1, 1, pat_work ) ;
MOS_horizon( 0, 639 ) ;
MOS_vertical( 0, 479 ) ;
MOS_disp( 1 ) ;
}
POINT GRA_mos_left_drop( POINT point )
{
int button ;
do{
MOS_rdpos( &button, &point.x, &point.y ) ;
} while( (button & 0x01) == 0 ) ;
return point ;
}
void GRA_mos_left_up( void )
{
int button ;
POINT point ;
do{
MOS_rdpos( &button, &point.x, &point.y ) ;
} while( (button & 0x01) != 0 ) ;
}
RECT select( RECT rect )
{
POINT point ;
int button ;
for( ; ; ){
point = GRA_mos_left_drop( point ) ;
MOS_disp( 0 ) ;
GRA_mos_left_up() ;
rect.x1 = rect.x2 = point.x ;
rect.y1 = rect.y2 = point.y ;
GRA_box_xor( rect ) ;
do{
MOS_rdpos( &button, &point.x, &point.y ) ;
if ( (rect.x2 - point.x) != 0 || (rect.y2 - point.y) != 0 ){
GRA_box_xor( rect ) ;
rect.x2 = point.x ;
rect.y2 = point.y ;
GRA_box_xor( rect ) ;
}
} while( (button & 0x03) == 0 ) ;
GRA_box_xor( rect ) ;
MOS_disp( 1 ) ;
if( (button & 0x01) != 0 ) break ;
}
if( rect.x1 > rect.x2 ) swap( &rect.x1, &rect.x2 ) ;
if( rect.y1 > rect.y2 ) swap( &rect.y1, &rect.y2 ) ;
return rect ;
}
void GRA_box_xor( RECT rect )
{
char para[10] ;
EGB_writeMode( gwk, 4 ) ;
EGB_color( gwk, 0, 0x0F ) ;
WORD(para + 0) = rect.x1 ;
WORD(para + 2) = rect.y1 ;
WORD(para + 4) = rect.x2 ;
WORD(para + 6) = rect.y2 ;
EGB_rectangle( gwk, para ) ;
}
void swap( int *data1, int *data2 )
{
int tmp ;
tmp = *data1 ;
*data1 = *data2 ;
*data2 = tmp ;
}